Next.jsã®éšåçããªã¬ã³ããªã³ã°ã®åãè§£ãæŸã¡ãŸãããããã®ãã€ããªããã¬ã³ããªã³ã°æŠç¥ããã°ããŒãã«ãªãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãSEOãã©ã®ããã«åäžãããããã芧ãã ããã
Next.jsã®éšåçããªã¬ã³ããªã³ã°ïŒã°ããŒãã«ããã©ãŒãã³ã¹ã®ããã®ãã€ããªããã¬ã³ããªã³ã°ããã¹ã¿ãŒãã
é²åãç¶ãããŠã§ãéçºã®äžçã«ãããŠãäžçäžã®ãªãŒãã£ãšã³ã¹ã«è¶ é«éã§ãã€ãããã¯ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããšã¯æãéèŠã§ããåŸæ¥ãéçºè ã¯æ¯é¡ã®ãªãé床ãå®çŸããéçãµã€ãçæïŒSSGïŒãããåçã³ã³ãã³ãã«å¯Ÿå¿ãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãŸã§ãããŸããŸãªã¬ã³ããªã³ã°æŠç¥ã«äŸåããŠããŸããããããããããã®ã¢ãããŒãéã®ã®ã£ãããåããããšãç¹ã«è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠã¯ããã°ãã°èª²é¡ãšãªã£ãŠããŸãããããã§ç»å Žããã®ãNext.jsã®éšåçããªã¬ã³ããªã³ã°ïŒçŸåšã¯ã¹ããªãŒãã³ã°ã䌎ãã€ã³ã¯ãªã¡ã³ã¿ã«éçåçæãšããŠç¥ãããŠããŸãïŒã§ããããã¯ãäž¡æ¹ã®äžçã®é·æãæäŸããããã«èšèšãããæŽç·Žããããã€ããªããã¬ã³ããªã³ã°æŠç¥ã§ãããã®é©æ°çãªæ©èœã«ãããéçºè ã¯ã³ã³ãã³ãã®å€§éšåã§éççæã®å©ç¹ã掻çšãã€ã€ããŠã§ãããŒãžå ã®é »ç¹ã«æŽæ°ãããç¹å®ã®ã»ã¯ã·ã§ã³ã§ã¯åçãªæŽæ°ãå¯èœã«ããããšãã§ããŸãããã®ããã°èšäºã§ã¯ãéšåçããªã¬ã³ããªã³ã°ã®è€éããæ·±ãæãäžãããã®æè¡çåºç€ãå©ç¹ããŠãŒã¹ã±ãŒã¹ããããŠéçºè ãããã«ããŠé«æ§èœã§ã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããæ¢ããŸãã
Next.jsã«ãããã¬ã³ããªã³ã°ã®ã¹ãã¯ãã©ã ãçè§£ãã
éšåçããªã¬ã³ããªã³ã°ã®è©³çްã«å ¥ãåã«ãNext.jsãæŽå²çã«ãµããŒãããŠããåºæ¬çãªã¬ã³ããªã³ã°æŠç¥ãšãããããããŸããŸãªãŠã§ãéçºã®ããŒãºã«ã©ã®ããã«å¯Ÿå¿ããŠããããçè§£ããããšãéèŠã§ããNext.jsã¯ãæè»æ§ãšããã©ãŒãã³ã¹ã®æé©åãæäŸããæ§ã ãªã¬ã³ããªã³ã°ãã¿ãŒã³ã®å®çŸã«ãããŠæåç·ã«ç«ã£ãŠããŸããã
1. éçãµã€ãçæ (SSG)
SSGã¯ããã«ãæã«ãã¹ãŠã®ããŒãžãHTMLã«äºåã¬ã³ããªã³ã°ããããšãå«ã¿ãŸããããã¯ããã¹ãŠã®ãªã¯ãšã¹ãã«å¯ŸããŠããµãŒããŒãå®å šã«åœ¢æãããHTMLãã¡ã€ã«ãéä¿¡ããããšãæå³ããŸããSSGãæäŸãããã®ïŒ
- é©ç°çãªããã©ãŒãã³ã¹ïŒããŒãžã¯CDNããçŽæ¥æäŸããããããã»ãŒç¬æã®èªã¿èŸŒã¿æéãå®çŸããŸãã
- åªããSEOïŒæ€çŽ¢ãšã³ãžã³ã¯éçãªHTMLã³ã³ãã³ãã容æã«ã¯ããŒã«ããã€ã³ããã¯ã¹ã§ããŸãã
- é«ãå¯çšæ§ãšã¹ã±ãŒã©ããªãã£ïŒéçã¢ã»ããã¯ã°ããŒãã«ãããã¯ãŒã¯å šäœã«å®¹æã«åæ£ãããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒããã°ãããŒã±ãã£ã³ã°ãµã€ããããã¥ã¡ã³ããeã³ããŒã¹ã®ååããŒãžïŒååããŒã¿ãç§åäœã§å€æŽãããªãå ŽåïŒã
2. ãµãŒããŒãµã€ãã¬ã³ããªã³ã° (SSR)
SSRã§ã¯ãåãªã¯ãšã¹ãããµãŒããŒã«ããŒãžã®HTMLãã¬ã³ããªã³ã°ãããŸããããã¯ãé »ç¹ã«å€æŽãããã³ã³ãã³ãããåãŠãŒã¶ãŒã«åãããŠããŒãœãã©ã€ãºãããã³ã³ãã³ãã«æé©ã§ãã
- åçã³ã³ãã³ãïŒåžžã«ææ°ã®æ å ±ãæäŸããŸãã
- ããŒãœãã©ã€ãŒãŒã·ã§ã³ïŒã³ã³ãã³ããåã ã®ãŠãŒã¶ãŒã«åãããŠèª¿æŽã§ããŸãã
課é¡ïŒåãªã¯ãšã¹ãã§ãµãŒããŒã®èšç®ãå¿ èŠãªãããSSGãããé ããªãå¯èœæ§ããããŸããéåžžã«åçãªã³ã³ãã³ãã«å¯ŸããŠã¯ãCDNãã£ãã·ã³ã°ã®å¹æãäœããªããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒãŠãŒã¶ãŒããã·ã¥ããŒãããªã¢ã«ã¿ã€ã ã®æ ªäŸ¡æ å ±ãææ°ã®æ£ç¢ºæ§ãæ±ããããã³ã³ãã³ãã
3. ã€ã³ã¯ãªã¡ã³ã¿ã«éçåçæ (ISR)
ISRã¯ãSSGã®å©ç¹ãšããã«ãåŸã«éçããŒãžãæŽæ°ããèœåãçµã¿åããããã®ã§ããããŒãžã¯ããµã€ãå
šäœã®åãã«ããªãã«ã宿çãŸãã¯ãªã³ããã³ãã§åçæã§ããŸããããã¯revalidate
æéãèšå®ããããšã§å®çŸããããã®æéãçµéããåŸã®æ¬¡ã®ãªã¯ãšã¹ãã§ããŒãžãããã¯ã°ã©ãŠã³ãã§åçæãããŸããåçæãããããŒãžããŠãŒã¶ãŒã®ãªã¯ãšã¹ãããå
ã«æºåã§ããã°ããŠãŒã¶ãŒã¯æŽæ°ãããããŒãžãååŸããŸããããã§ãªãå Žåã¯ãæ°ããããŒãžãçæãããŠããéãå€ãããŒãžãååŸããŸãã
- ããã©ãŒãã³ã¹ãšé®®åºŠã®ãã©ã³ã¹ïŒéçãªå©ç¹ãšåçãªæŽæ°ãäž¡ç«ããŸãã
- ãã«ãæéã®ççž®ïŒè»œåŸ®ãªã³ã³ãã³ã倿Žã®ããã«ãµã€ãå šäœãåãã«ãããå¿ èŠããªããªããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒãã¥ãŒã¹èšäºãäŸ¡æ Œãå€åããååãªã¹ããé »ç¹ã«æŽæ°ãããããŒã¿è¡šç€ºã
éšåçããªã¬ã³ããªã³ã°ã®èªçïŒãšãã®é²åïŒ
éšåçããªã¬ã³ããªã³ã°ã®æŠå¿µã¯ãNext.jsã«ããã驿°çãªäžæ©ã§ãããããéèŠãªå¶çŽã«å¯ŸåŠããããšãç®çãšããŠããŸãããããã¯ãããŒãžã®éçãªéšåãå³åº§ã«ã¬ã³ããªã³ã°ãã€ã€ãããŒãžå šäœã®èªã¿èŸŒã¿ããããã¯ããããšãªããåçã§é »ç¹ã«æŽæ°ãããããŒã¿ãååŸããŠè¡šç€ºããã«ã¯ã©ãããã°ãããããšããåé¡ã§ãã
eã³ããŒã¹ãµã€ãã®ååããŒãžãæ³åããŠã¿ãŠãã ãããäž»èŠãªååæ å ±ïŒååã説æãç»åïŒã¯ãã£ãã«å€æŽããããSSGã«å®å šã«é©ããŠãããããããŸããããããããªã¢ã«ã¿ã€ã ã®åšåº«ç¶æ³ã顧客ã¬ãã¥ãŒããŸãã¯ããŒãœãã©ã€ãºãããããããååã¯ãã¯ããã«é »ç¹ã«å€ãããŸãã以åã¯ãéçºè ã¯ä»¥äžã®ãããããéžæããå¿ èŠããããŸããïŒ
- ããŒãžå šäœãSSRã§ã¬ã³ããªã³ã°ããïŒéççæã®ããã©ãŒãã³ã¹äžã®å©ç¹ãç ç²ã«ããã
- åçãªéšåã«ã¯ã©ã€ã¢ã³ããµã€ããã§ããã䜿çšããïŒããŒãã£ã³ã°ã¹ãããŒãã³ã³ãã³ãã®ããïŒCumulative Layout ShiftïŒãçºçããæé©ãšã¯èšããªããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªããå¯èœæ§ãããã
éšåçããªã¬ã³ããªã³ã°ã¯ãããŒãžã®äžéšïŒåå説æãªã©ïŒãéçã«ã¬ã³ããªã³ã°ããä»ã®éšåïŒåšåº«æ°ãªã©ïŒããµãŒããŒã§ããŒãžå šäœã®çæãåŸ ã€ããšãªãåçã«ååŸã»ã¬ã³ããªã³ã°ã§ããããã«ããããšã§ããã®åé¡ã解決ããããšãç®æããŸããã
ã¹ããªãŒãã³ã°SSRãšReact Server Componentsãžã®é²å
Next.jså ã®çšèªãå®è£ ã®è©³çްã¯é²åããŠããããšã«æ³šæããããšãéèŠã§ããéçã³ã³ãã³ããæåã«é ä¿¡ãããã®åŸåçãªéšåã§æ®µéçã«æ¡åŒµãããšããäžå¿çãªã¢ã€ãã¢ã¯ãçŸåšã§ã¯äž»ã«ã¹ããªãŒãã³ã°SSRãšReact Server Componentsã«ãã£ãŠãããããã鲿©ã«ãã£ãŠã«ããŒãããŠããŸãããéšåçããªã¬ã³ããªã³ã°ããšããç¹å®ã®æ©èœåã¯çŸåšã§ã¯ããŸã匷調ãããŠããŸãããããã®æ ¹åºã«ããååã¯çŸä»£ã®Next.jsã¬ã³ããªã³ã°æŠç¥ã«äžå¯æ¬ ãªãã®ã§ãã
ã¹ããªãŒãã³ã°SSRã«ããããµãŒããŒã¯ã¬ã³ããªã³ã°ãããã«ã€ããŠHTMLããã£ã³ã¯ã§éä¿¡ã§ããŸããããã«ããããŠãŒã¶ãŒã¯ããŒãžã®éçãªéšåãã¯ããã«æ©ãèŠãããšãã§ããŸããReact Server ComponentsïŒRSCïŒã¯ãã³ã³ããŒãã³ããå®å šã«ãµãŒããŒäžã§ã¬ã³ããªã³ã°ãããæå°éã®JavaScriptã®ã¿ãã¯ã©ã€ã¢ã³ãã«éä¿¡ããããšãããã©ãã€ã ã·ããã§ããããã«ãããããã©ãŒãã³ã¹ãããã«åäžããäœãéçã§äœãåçãããã现ããå¶åŸ¡ã§ããããã«ãªããŸãã
ãã®è°è«ã®ç®çã®ãããç§ãã¡ã¯éšåçããªã¬ã³ããªã³ã°ãæå±ããçŸåšãããã®é«åºŠãªæ©èœãéããŠå®çŸãããŠããæŠå¿µçãªå©ç¹ãšãã¿ãŒã³ã«çŠç¹ãåœãŠãŸãã
éšåçããªã¬ã³ããªã³ã°ã®ä»çµã¿ïŒæŠå¿µïŒ
éšåçããªã¬ã³ããªã³ã°ã®èåŸã«ããã¢ã€ãã¢ã¯ãéçã«çæãããã»ã°ã¡ã³ããšåçã«ååŸãããã»ã°ã¡ã³ãã®äž¡æ¹ã§ããŒãžãæ§æã§ãããã€ããªããã¢ãããŒããå¯èœã«ããããšã§ããã
ããã°èšäºã®ããŒãžãèããŠã¿ãŸããããäž»èŠãªèšäºã³ã³ãã³ããèè 玹ä»ãã³ã¡ã³ãã»ã¯ã·ã§ã³ã¯ãã«ãæã«äºåã¬ã³ããªã³ã°ïŒSSGïŒã§ããŸããããããããããããã·ã§ã¢ã®æ°ããŸãã¯ãªã¢ã«ã¿ã€ã ã®ããã¬ã³ããããã¯ããŠã£ãžã§ããã¯ãããé »ç¹ã«æŽæ°ããå¿ èŠããããããããŸããã
éšåçããªã¬ã³ããªã³ã°ã¯ãNext.jsã«ä»¥äžã®ããšãå¯èœã«ããŸãïŒ
- éçãªéšåãäºåã¬ã³ããªã³ã°ããïŒäž»èŠãªèšäºãèè 玹ä»ãã³ã¡ã³ããªã©ã¯éçãªHTMLãšããŠçæãããŸãã
- åçãªéšåãèå¥ããïŒãããããã®æ°ããã¬ã³ããããã¯ãªã©ã®ã»ã¯ã·ã§ã³ã¯åçãšããŠããŒã¯ãããŸãã
- éçãªéšåãå³åº§ã«æäŸããïŒãŠãŒã¶ãŒã¯éçãªHTMLãåãåãããããšå¯Ÿè©±ãå§ããããšãã§ããŸãã
- åçãªéšåãéåæã§ååŸã»ã¬ã³ããªã³ã°ããïŒãµãŒããŒïŒãŸãã¯å®è£ ã®è©³çްã«ãã£ãŠã¯ã¯ã©ã€ã¢ã³ãïŒãåçããŒã¿ãååŸããããŒãžå šäœããªããŒãããããšãªãããŒãžã«æ¿å ¥ããŸãã
ãã®ãã¿ãŒã³ã¯ãéçã³ã³ãã³ããšåçã³ã³ãã³ãã®ã¬ã³ããªã³ã°ã广çã«åé¢ããç¹ã«ã³ã³ãã³ãã®é®®åºŠèŠä»¶ãæ··åšããããŒãžã«ãããŠãã¯ããã«ã¹ã ãŒãºã§é«éãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå¯èœã«ããŸãã
ãã€ããªããã¬ã³ããªã³ã°ã®äž»ãªå©ç¹ïŒéšåçããªã¬ã³ããªã³ã°ã®ååã«åºã¥ãïŒ
éšåçããªã¬ã³ããªã³ã°ã®ååã«ãã£ãŠæå±ããããã€ããªããã¬ã³ããªã³ã°ã¢ãããŒãã¯ãã°ããŒãã«ãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ãªå€ãã®å©ç¹ãæäŸããŸãïŒ
1. ããã©ãŒãã³ã¹ã®åäžãšã¬ã€ãã³ã·ã®åæž
éçã³ã³ãã³ããå³åº§ã«æäŸããããšã§ããŠãŒã¶ãŒã¯ããŒãžã®èªã¿èŸŒã¿ãã¯ããã«éããšèªèããŸããåçã³ã³ãã³ãã¯å©çšå¯èœã«ãªã次第ååŸã»è¡šç€ºãããããããŠãŒã¶ãŒããµãŒããŒäžã§ããŒãžå šäœãã¬ã³ããªã³ã°ãããã®ãåŸ ã€æéãççž®ãããŸãã
ã°ããŒãã«ãžã®åœ±é¿ïŒãããã¯ãŒã¯ã¬ã€ãã³ã·ãé«ãå°åã®ãŠãŒã¶ãŒã«ãšã£ãŠãæåã«éçã³ã³ãã³ããåãåãããšã¯ã圌ãã®åæäœéšãåçã«æ¹åããããšãã§ããŸããCDNã¯éçã»ã°ã¡ã³ããå¹ççã«æäŸããåçããŒã¿ã¯æå¯ãã®å©çšå¯èœãªãµãŒããŒããååŸã§ããŸãã
2. ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ïŒUXïŒã®åäž
ãã®æŠç¥ã®äž»ãªç®æšã¯ãå€ãã®åçã¢ããªã±ãŒã·ã§ã³ãæ©ãŸããå¿ãŸããããçœãç»é¢ãããããŒãã£ã³ã°ã¹ãããŒããæå°éã«æããããšã§ãããŠãŒã¶ãŒã¯ãããŒãžã®ä»ã®éšåããŸã èªã¿èŸŒãŸããŠããéã«ã³ã³ãã³ãã®æ¶è²»ãéå§ã§ããŸããããã«ããããšã³ã²ãŒãžã¡ã³ããšæºè¶³åºŠãé«ãŸããŸãã
äŸïŒåœéçãªãã¥ãŒã¹ãŠã§ããµã€ãã¯ãèšäºã®ã³ã³ãã³ããå³åº§ã«èªã¿èŸŒã¿ãèªè ãèªã¿å§ããããããã«ããäžæ¹ã§éžæã®ã©ã€ãçµæãæ ªåŒåžå Žã®æŽæ°ã¯ããŒãžã®æå®ããããšãªã¢ã§ãªã¢ã«ã¿ã€ã ã«èªã¿èŸŒãŸããŸãã
3. åªããSEO
ããŒãžã®éçãªéšåã¯ãæ€çŽ¢ãšã³ãžã³ã«ãã£ãŠå®å šã«ã€ã³ããã¯ã¹å¯èœã§ããåçã³ã³ãã³ãããµãŒããŒäžã§ã¬ã³ããªã³ã°ãããïŒãŸãã¯ã¯ã©ã€ã¢ã³ãã§ã·ãŒã ã¬ã¹ã«ãã€ãã¬ãŒããããïŒãããæ€çŽ¢ãšã³ãžã³ã¯äŸç¶ãšããŠã³ã³ãã³ãã广çã«ã¯ããŒã«ããŠçè§£ã§ããããè¯ãæ€çŽ¢ã©ã³ãã³ã°ã«ã€ãªãããŸãã
ã°ããŒãã«ãªãªãŒãïŒåœéåžå Žãã¿ãŒã²ãããšããããžãã¹ã«ãšã£ãŠãå ç¢ãªSEOã¯äžå¯æ¬ ã§ãããã€ããªããã¢ãããŒãã¯ãéçãåçãã«ãããããããã¹ãŠã®ã³ã³ãã³ããçºèŠå¯èœæ§ã«è²¢ç®ããããšãä¿èšŒããŸãã
4. ã¹ã±ãŒã©ããªãã£ãšã³ã¹ãå¹ç
éçã¢ã»ããã®æäŸã¯ããã¹ãŠã®ãªã¯ãšã¹ãã«å¯ŸããŠãã¹ãŠã®ããŒãžããµãŒããŒã§ã¬ã³ããªã³ã°ããããããæ¬è³ªçã«ã¹ã±ãŒã©ãã«ã§ã³ã¹ãå¹çãé«ãã§ããã¬ã³ããªã³ã°ã®ããªãã®éšåãéçãã¡ã€ã«ã«ãªãããŒãããããšã§ããµãŒããŒã®è² è·ã軜æžãããã¹ãã£ã³ã°ã³ã¹ãã®åæžãšãã©ãã£ãã¯ã¹ãã€ã¯æã®ã¹ã±ãŒã©ããªãã£åäžã«ã€ãªãããŸãã
5. æè»æ§ãšéçºè ã®çç£æ§
éçºè ã¯ãåã³ã³ããŒãã³ããããŒãžã«æãé©ããã¬ã³ããªã³ã°æŠç¥ãéžæã§ããŸãããã®ãã现ããå¶åŸ¡ã«ãããåçãªæ©èœãæãªãããšãªãæé©åãå¯èœã§ããããã«ãããé¢å¿äºã®åé¢ãä¿é²ãããéçºãã¹ããŒãã¢ããã§ããŸãã
ãã€ããªããã¬ã³ããªã³ã°ã®å®äžçã§ã®ãŠãŒã¹ã±ãŒã¹
éšåçããªã¬ã³ããªã³ã°ãšãã€ããªããã¬ã³ããªã³ã°ã®ååã¯ãããŸããŸãªã°ããŒãã«ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«é©çšå¯èœã§ãïŒ
1. Eã³ããŒã¹ãã©ãããã©ãŒã
ã·ããªãªïŒæ°çŸäžã®ååãå±ç€ºããã°ããŒãã«ãªãªã³ã©ã€ã³å°å£²æ¥è ã
- éçïŒåå説æãç»åã仿§ãéçãªããã¢ãŒã·ã§ã³ãããŒã
- åçïŒãªã¢ã«ã¿ã€ã ã®åšåº«ç¶æ³ãäŸ¡æ ŒæŽæ°ãããŒãœãã©ã€ãºããããããªããžã®ãããããã»ã¯ã·ã§ã³ããŠãŒã¶ãŒã¬ãã¥ãŒãã«ãŒãã®å 容ã
å©ç¹ïŒãŠãŒã¶ãŒã¯ã»ãŒç¬æã®èªã¿èŸŒã¿æéã§ååãé²èЧã§ããéçãªè©³çްãããã«èŠãããšãã§ããŸããåšåº«ã¬ãã«ãããŒãœãã©ã€ãºããããããããªã©ã®åçèŠçŽ ã¯ã·ãŒã ã¬ã¹ã«æŽæ°ãããé åçãªã·ã§ããã³ã°äœéšãæäŸããŸãã
2. ã³ã³ãã³ã管çã·ã¹ãã ïŒCMSïŒãšããã°
ã·ããªãªïŒåœéçãªãã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒã人æ°ã®ããã°ã
- éçïŒèšäºã³ã³ãã³ããèè 玹ä»ãã¢ãŒã«ã€ããããæçš¿ããµã€ãããã²ãŒã·ã§ã³ã
- åçïŒãªã¢ã«ã¿ã€ã ã®ã³ã¡ã³ãæ°ãããã/ã·ã§ã¢æ°ããã¬ã³ããããã¯ãã©ã€ããã¥ãŒã¹ãã£ãã«ãŒãããŒãœãã©ã€ãºãããã³ã³ãã³ããã£ãŒãã
å©ç¹ïŒèªè ã¯èšäºã«å³åº§ã«ã¢ã¯ã»ã¹ã§ããŸãããšã³ã²ãŒãžã¡ã³ãææšãåçã³ã³ãã³ãã»ã¯ã·ã§ã³ã¯ãèªæžã®æµãã劚ããããšãªãæŽæ°ãããŸããããã¯ã驿æ§ãéèŠãªãã¥ãŒã¹ãµã€ãã«ãšã£ãŠäžå¯æ¬ ã§ãã
3. SaaSããã·ã¥ããŒããšã¢ããªã±ãŒã·ã§ã³
ã·ããªãªïŒãŠãŒã¶ãŒåºæã®ããŒã¿ãæã€SaaSïŒSoftware-as-a-ServiceïŒã¢ããªã±ãŒã·ã§ã³ã
- éçïŒã¢ããªã±ãŒã·ã§ã³ã®ã¬ã€ã¢ãŠããããã²ãŒã·ã§ã³ãå ±éã®UIã³ã³ããŒãã³ãããŠãŒã¶ãŒãããã¡ã€ã«ã®æ§é ã
- åçïŒãªã¢ã«ã¿ã€ã ã®ããŒã¿å¯èŠåããŠãŒã¶ãŒåºæã®åæãéç¥æ°ãã¢ã¯ãã£ããã£ãã°ãã©ã€ãã·ã¹ãã ã¹ããŒã¿ã¹ã
å©ç¹ïŒãŠãŒã¶ãŒã¯ãã°ã€ã³ããŠã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ãŒã¹ãè¿ éã«èªã¿èŸŒãŸããã®ã確èªã§ããŸãããã®åŸãå人ã®ããŒã¿ããªã¢ã«ã¿ã€ã ã®æŽæ°ãååŸã»è¡šç€ºãããå¿çæ§ãé«ãæ å ±è±å¯ãªããã·ã¥ããŒããæäŸãããŸãã
4. ã€ãã³ãã»ãã±ãã販売ãµã€ã
ã·ããªãªïŒã°ããŒãã«ãªã€ãã³ãã®ãã±ããã販売ãããã©ãããã©ãŒã ã
- éçïŒã€ãã³ã詳现ïŒäŒå Žãæ¥ä»ïŒãåºæŒè 玹ä»ãäžè¬çãªãµã€ãæ§é ã
- åçïŒåº§åžã®ç©ºãç¶æ³ããªã¢ã«ã¿ã€ã ã®ãã±ãã販売ãã€ãã³ãéå§ãŸã§ã®ã«ãŠã³ãããŠã³ã¿ã€ããŒãåçäŸ¡æ Œèšå®ã
å©ç¹ïŒã€ãã³ãããŒãžã¯äž»èŠãªè©³çްæ å ±ãšãšãã«è¿ éã«èªã¿èŸŒãŸããŸãããŠãŒã¶ãŒã¯ãã±ããã®ç©ºãç¶æ³ãäŸ¡æ Œã«é¢ããã©ã€ãæŽæ°ãèŠãããšãã§ããããã¯ã³ã³ããŒãžã§ã³ã®ä¿é²ãšãŠãŒã¶ãŒã®æåŸ 管çã«äžå¯æ¬ ã§ãã
çŸä»£ã®Next.jsã«ããããã€ããªããã¬ã³ããªã³ã°ã®å®è£
ãéšåçããªã¬ã³ããªã³ã°ããšããçšèªã¯ä»æ¥å¯Ÿè©±ããäž»èŠãªAPIã§ã¯ãªããããããŸãããããã®æŠå¿µã¯Next.jsã®çŸä»£çãªã¬ã³ããªã³ã°æ©èœãç¹ã«ã¹ããªãŒãã³ã°SSRãšReact Server Components (RSC)ã«æ·±ãçµ±åãããŠããŸãããããã®æ©èœãçè§£ããããšãããã€ããªããã¬ã³ããªã³ã°ãå®è£ ããéµãšãªããŸãã
ã¹ããªãŒãã³ã°SSRã®æŽ»çš
ã¹ããªãŒãã³ã°SSRã«ããããµãŒããŒã¯HTMLããã£ã³ã¯ã§éä¿¡ã§ããŸããããã¯ãgetServerSideProps
ããrevalidate
ã䌎ãgetStaticProps
ïŒISRçšïŒãããã³åçã«ãŒãã»ã°ã¡ã³ãã䜿çšããå Žåã«ããã©ã«ãã§æå¹ã«ãªããŸãã
éèŠãªã®ã¯ãéçãªã³ã³ããŒãã³ããæåã«ã¬ã³ããªã³ã°ã»éä¿¡ããããã®åŸã«åçãªãã§ãããå¿ èŠãªã³ã³ããŒãã³ããç¶ãããã«ã¢ããªã±ãŒã·ã§ã³ãæ§æããããšã§ãã
getServerSideProps
ã䜿çšããäŸïŒ
// pages/products/[id].js
function ProductPage({ product, reviews }) {
return (
{product.name}
{product.description}
{/* Dynamic content fetched separately or streamed in */}
Customer Reviews
{reviews.map(review => (
- {review.text}
))}
);
}
export async function getServerSideProps(context) {
const { id } = context.params;
// Fetch static product data
const productResponse = await fetch(`https://api.example.com/products/${id}`);
const product = await productResponse.json();
// Fetch dynamic reviews data
const reviewsResponse = await fetch(`https://api.example.com/products/${id}/reviews`);
const reviews = await reviewsResponse.json();
return {
props: {
product,
reviews,
},
};
}
export default ProductPage;
ã¹ããªãŒãã³ã°SSRã䜿çšãããšãNext.jsã¯reviews
ããŒã¿ãå®å
šã«ååŸã»ã¬ã³ããªã³ã°ãããåã«ãproduct
ã«é¢é£ããh1
ããã³p
ã¿ã°ã®HTMLãéä¿¡ã§ããŸããããã«ãããäœæããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã
React Server Components (RSC) ã®çµ±å
React Server Componentsã¯ããã€ããªããã¬ã³ããªã³ã°ãå®çŸããããã®ããæ·±é ãªæ¹æ³ãæäŸããŸããRSCã¯ãµãŒããŒäžã§ã®ã¿ã¬ã³ããªã³ã°ãããçµæã®HTMLãŸãã¯æå°éã®ã¯ã©ã€ã¢ã³ããµã€ãJavaScriptã®ã¿ããã©ãŠã¶ã«éä¿¡ãããŸããããã«ãããäœãéçã§äœãåçããéåžžã«ãã现ããå¶åŸ¡ã§ããŸãã
éçãªããŒãžã·ã§ã«ã®ããã«Server Componentã䜿çšãããã®äžã§ç¬èªã®åçããŒã¿ãã¯ã©ã€ã¢ã³ããµã€ãã§ãã§ããããClient Componentã䜿çšãããããããã¯åçã«ãã§ãããããä»ã®Server Componentã䜿çšããããšãã§ããŸãã
æŠå¿µçãªäŸïŒRSCãã¿ãŒã³ã䜿çšïŒïŒ
// app/products/[id]/page.js (Server Component)
import ProductDetails from './ProductDetails'; // Server Component
import LatestReviews from './LatestReviews'; // Server Component (can be dynamically fetched)
async function ProductPage({ params }) {
const { id } = params;
// ProductDetails will fetch its own data on the server
return (
{/* LatestReviews can be a Server Component that fetches fresh data on each request or is streamed */}
);
}
export default ProductPage;
// app/products/[id]/ProductDetails.js (Server Component)
async function ProductDetails({ productId }) {
const product = await fetch(`https://api.example.com/products/${productId}`).then(res => res.json());
return (
{product.name}
{product.description}
);
}
// app/products/[id]/LatestReviews.js (Server Component)
async function LatestReviews({ productId }) {
// This component can be configured to revalidate data frequently or fetch on demand
const reviews = await fetch(`https://api.example.com/products/${productId}/reviews`, { next: { revalidate: 60 } }).then(res => res.json());
return (
Customer Reviews
{reviews.map(review => (
- {review.text}
))}
);
}
ãã®RSCã®äŸã§ã¯ãProductDetails
ã¯çŽç²ãªServer Componentã§ãããäºåã¬ã³ããªã³ã°ãããŸããLatestReviews
ãServer Componentã§ãããåæ€èšŒãªãã·ã§ã³ä»ãã®fetch
ã䜿çšããŠæ°ããããŒã¿ãååŸããããã«æ§æã§ããéçã«ã¬ã³ããªã³ã°ãããããŒãžã·ã§ã«å
ã§å¹æçã«åçãªæŽæ°ãå®çŸããŸãã
æ£ããæŠç¥ã®éžæïŒSSG vs. ISR vs. ã¹ããªãŒãã³ã°ã䌎ãSSR
ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåã«ã©ã®ã¬ã³ããªã³ã°æŠç¥ãæ¡çšãããã®æ±ºå®ã¯ãããã€ãã®èŠå ã«äŸåããŸãïŒ
- ã³ã³ãã³ãã®æ®çºæ§ïŒããŒã¿ãã©ããããã®é »åºŠã§å€ãããïŒãã£ãã«å€ãããªãã³ã³ãã³ãã«ã¯SSGãçæ³çã§ããé »ç¹ã«å€ããããªã¢ã«ã¿ã€ã ã§ã¯ãªãã³ã³ãã³ãã«ã¯ISRãé©ããŠããŸããçã«ãªã¢ã«ã¿ã€ã ã®ããŒã¿ã«ã¯ãã¹ããªãŒãã³ã°ã䌎ãSSRãClient Componentå ã§ã®åçãã§ãããå¿ èŠã«ãªãå ŽåããããŸãã
- ããŒãœãã©ã€ãŒãŒã·ã§ã³èŠä»¶ïŒã³ã³ãã³ãããŠãŒã¶ãŒããšã«é«åºŠã«ããŒãœãã©ã€ãºãããŠããå ŽåãSSRãŸãã¯Client Componentå ã§ã®ã¯ã©ã€ã¢ã³ããµã€ããã§ãããå¿ èŠã«ãªããŸãã
- ããã©ãŒãã³ã¹ç®æšïŒæé«ã®ããã©ãŒãã³ã¹ãåŸãããã«ãå¯èœãªéãéççæãåªå ããŠãã ããã
- ãã«ãæéïŒéåžžã«å€§èŠæš¡ãªãµã€ãã§ã¯ãSSGã«å€§ããäŸåãããšãã«ãæéãé·ããªãå¯èœæ§ããããŸããISRãšåçã¬ã³ããªã³ã°ã¯ããã軜æžã§ããŸãã
ã°ããŒãã«å®è£ ã«ããã課é¡ãšèæ ®äºé
ãã€ããªããã¬ã³ããªã³ã°ã¯å€§ããªå©ç¹ãæäŸããŸãããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®ããã«ã¯å¿ã«çããŠããã¹ãèæ ®äºé ããããŸãïŒ
- APIã¬ã€ãã³ã·ïŒåçãªããŒã¿ãã§ããã¯ãäŸç¶ãšããŠããã¯ãšã³ãAPIã®ã¬ã€ãã³ã·ã«äŸåããŸããAPIãã°ããŒãã«ã«åæ£ãããããã©ãŒãã³ã¹ãé«ãããšã確èªããŠãã ããã
- ãã£ãã·ã³ã°æŠç¥ïŒéçã¢ã»ããïŒCDNçµç±ïŒãšåçããŒã¿ïŒAPIãã£ãã·ã³ã°ãRedisãªã©çµç±ïŒã®äž¡æ¹ã«å¯ŸããŠå¹æçãªãã£ãã·ã³ã°ãå®è£ ããããšã¯ãããŸããŸãªå°åã§ããã©ãŒãã³ã¹ãç¶æããããã«äžå¯æ¬ ã§ãã
- ã¿ã€ã ãŸãŒã³ãšããŒã«ãªãŒãŒã·ã§ã³ïŒåçã³ã³ãã³ãã¯ãç°ãªãã¿ã€ã ãŸãŒã³ãèæ ®ã«å ¥ããå¿ èŠãããå ŽåïŒäŸïŒã€ãã³ãéå§æéã®è¡šç€ºïŒããç°ãªãå°ååãã«ããŒã«ã©ã€ãºããå¿ èŠãããå ŽåããããŸãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ïŒãšããžé¢æ°ãšã°ããŒãã«CDNããµããŒããããã©ãããã©ãŒã ïŒVercelãNetlifyãAWS Amplifyãªã©ïŒã«Next.jsã¢ããªã±ãŒã·ã§ã³ããããã€ããããšã¯ãäžçäžã§äžè²«ãããšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ãã
ãã€ããªããã¬ã³ããªã³ã°ãæé©åããããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®ããã«ãã€ããªããã¬ã³ããªã³ã°ã®å©ç¹ãæå€§åããã«ã¯ïŒ
- éçã³ã³ãã³ããšåçã³ã³ãã³ãããã现ããç¹å®ããïŒããŒãžãåæããã©ã®ã»ã¯ã·ã§ã³ãéçã§ãã©ã®ã»ã¯ã·ã§ã³ãåçãªæŽæ°ãå¿ èŠãšããããç¹å®ããŸãã
- é »ç¹ã«æŽæ°ãããéçã³ã³ãã³ãã«ISRãå©çšããïŒé©åãª
revalidate
å€ãèšå®ããŠãçµ¶ãéãªãåãã«ããªãã«ã³ã³ãã³ããæ°é®®ã«ä¿ã¡ãŸãã - React Server Componentsãæ¡çšããïŒãµãŒããŒå°çšã®ããžãã¯ãšããŒã¿ãã§ããã«RSCãæŽ»çšããã¯ã©ã€ã¢ã³ããµã€ãã®JavaScriptãåæžããåæèªã¿èŸŒã¿æéãæ¹åããŸãã
- é«åºŠã«ã€ã³ã¿ã©ã¯ãã£ããŸãã¯ãŠãŒã¶ãŒåºæã®ããŒã¿ã«ã¯ã¯ã©ã€ã¢ã³ããµã€ããã§ãããå®è£ ããïŒçŸåšã®ãŠãŒã¶ãŒã«ã®ã¿åœ±é¿ããSEOã«ãšã£ãŠéèŠã§ã¯ãªãUIã®éšåã«ã¯ãClient Componentå ã§ã®ã¯ã©ã€ã¢ã³ããµã€ããã§ããã广çã§ãã
- APIããã©ãŒãã³ã¹ãæé©åããïŒããã¯ãšã³ãAPIãé«éã§ã¹ã±ãŒã©ãã«ã§ãããçæ³çã«ã¯ã°ããŒãã«ãªãã¬ãŒã³ã¹ãã€ã³ããæã€ããšã確èªããŸãã
- ã°ããŒãã«CDNãæŽ»çšããïŒéçã¢ã»ããïŒHTMLãCSSãJSãç»åïŒãCDNããæäŸããäžçäžã®ãŠãŒã¶ãŒã®ã¬ã€ãã³ã·ãåæžããŸãã
- ããã©ãŒãã³ã¹ãç£èŠããïŒGoogle PageSpeed InsightsãWebPageTestããªã¢ã«ãŠãŒã¶ãŒã¢ãã¿ãªã³ã°ïŒRUMïŒãªã©ã®ããŒã«ã䜿çšããŠãããŸããŸãªå°åã§ã®ãµã€ãã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããŸãã
çµè«
Next.jsã®ã¬ã³ããªã³ã°æŠç¥ã®é²åã¯ãéšåçããªã¬ã³ããªã³ã°ã®åæã®æŠå¿µãããã¹ããªãŒãã³ã°SSRãšReact Server Componentsã®åŒ·åãªæ©èœã«è³ããŸã§ãçŸä»£çã§é«æ§èœãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§ã®å€§ããªé£èºã衚ããŠããŸãããã€ããªããã¬ã³ããªã³ã°ã¢ãããŒããæ¡çšããããšã§ãéçºè ã¯æ¯é¡ã®ãªãé床ã§éçã³ã³ãã³ãã广çã«æäŸãã€ã€ãåçã§ãªã¢ã«ã¿ã€ã ã®ããŒã¿ãã·ãŒã ã¬ã¹ã«çµ±åããããšãã§ããŸãããã®æŠç¥ã¯åãªãæè¡çãªæé©åã§ã¯ãªããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«å¯ŸããŠåè¶ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåµé ããããã®åºæ¬çãªèŠçŽ ã§ããæ¬¡ã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«ã¯ããããã®ãã€ããªããã¬ã³ããªã³ã°ãã¿ãŒã³ããµã€ãã®ããã©ãŒãã³ã¹ãã¹ã±ãŒã©ããªãã£ããŠãŒã¶ãŒæºè¶³åºŠãã©ã®ããã«åäžãããããšãã§ããããæ€èšãããŸããŸãç«¶äºãæ¿åããããžã¿ã«ã®äžçã§éç«ã€ååšãšãªãããšãç®æããŠãã ããã